home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / Pager / Jumping.php < prev    next >
PHP Script  |  2004-10-01  |  10KB  |  267 lines

  1. <?php
  2. // +-----------------------------------------------------------------------+
  3. // | Copyright (c) 2002-2003, Richard Heyes, Lorenzo Alberton              |
  4. // | All rights reserved.                                                  |
  5. // |                                                                       |
  6. // | Redistribution and use in source and binary forms, with or without    |
  7. // | modification, are permitted provided that the following conditions    |
  8. // | are met:                                                              |
  9. // |                                                                       |
  10. // | o Redistributions of source code must retain the above copyright      |
  11. // |   notice, this list of conditions and the following disclaimer.       |
  12. // | o Redistributions in binary form must reproduce the above copyright   |
  13. // |   notice, this list of conditions and the following disclaimer in the |
  14. // |   documentation and/or other materials provided with the distribution.|
  15. // | o The names of the authors may not be used to endorse or promote      |
  16. // |   products derived from this software without specific prior written  |
  17. // |   permission.                                                         |
  18. // |                                                                       |
  19. // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
  20. // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
  21. // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
  22. // | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
  23. // | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
  24. // | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
  25. // | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
  26. // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
  27. // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
  28. // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
  29. // | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
  30. // |                                                                       |
  31. // +-----------------------------------------------------------------------+
  32. // | Authors: Richard Heyes <richard@phpguru.org>                          |
  33. // |          Lorenzo Alberton <l.alberton at quipo.it>                    |
  34. // +-----------------------------------------------------------------------+
  35. //
  36. // $Id: Jumping.php,v 1.5 2004/01/16 10:29:57 quipo Exp $
  37.  
  38. require_once 'Pager/Common.php';
  39.  
  40. /**
  41.  * File Jumping.php
  42.  *
  43.  * @package Pager
  44.  */
  45. /**
  46.  * Pager_Jumping - Jumping Window Pager
  47.  *
  48.  * Handles paging a set of data. For usage see the example.php provided.
  49.  *
  50.  * @author Richard Heyes <richard@phpguru.org>,
  51.  * @author Lorenzo Alberton <l.alberton at quipo.it>
  52.  *
  53.  * @version  $Id: Jumping.php,v 1.5 2004/01/16 10:29:57 quipo Exp $
  54.  * @package Pager
  55.  */
  56. class Pager_Jumping extends Pager_Common
  57. {
  58.  
  59.     // {{{ Pager_Jumping()
  60.  
  61.     /**
  62.      * Constructor
  63.      *
  64.      * @param mixed $options    An associative array of option names
  65.      *                          and their values
  66.      * @access public
  67.      */
  68.     function Pager_Jumping($options = array())
  69.     {
  70.         $err = $this->_setOptions($options);
  71.         if ($err !== PAGER_OK) {
  72.             return $this->raiseError($this->errorMessage($err), $err);
  73.         }
  74.         $this->_generatePageData();
  75.         $this->_setFirstLastText();
  76.  
  77.         $this->links .= $this->_getBackLink();
  78.         $this->links .= $this->_getPageLinks();
  79.         $this->links .= $this->_getNextLink();
  80.  
  81.         $this->linkTags .= $this->_getFirstLinkTag();
  82.         $this->linkTags .= $this->_getPrevLinkTag();
  83.         $this->linkTags .= $this->_getNextLinkTag();
  84.         $this->linkTags .= $this->_getLastLinkTag();
  85.     }
  86.  
  87.     // }}}
  88.     // {{{ getPageIdByOffset()
  89.  
  90.     /**
  91.      * Returns pageID for given offset
  92.      *
  93.      * @param $index Offset to get pageID for
  94.      * @return int PageID for given offset
  95.      */
  96.     function getPageIdByOffset($index)
  97.     {
  98.         if (!isset($this->_pageData)) {
  99.             $this->_generatePageData();
  100.         }
  101.  
  102.         if (($index % $this->_perPage) > 0) {
  103.             $pageID = ceil((float)$index / (float)$this->_perPage);
  104.         } else {
  105.             $pageID = $index / $this->_perPage;
  106.         }
  107.         return $pageID;
  108.     }
  109.  
  110.     // }}}
  111.     // {{{ getPageRangeByPageId()
  112.  
  113.     /**
  114.      * Given a PageId, it returns the limits of the range of pages displayed.
  115.      * While getOffsetByPageId() returns the offset of the data within the
  116.      * current page, this method returns the offsets of the page numbers interval.
  117.      * E.g., if you have pageId=3 and delta=10, it will return (1, 10).
  118.      * PageID of 8 would give you (1, 10) as well, because 1 <= 8 <= 10.
  119.      * PageID of 11 would give you (11, 20).
  120.      * If the method is called without parameter, pageID is set to currentPage#.
  121.      *
  122.      * @param integer PageID to get offsets for
  123.      * @return array  First and last offsets
  124.      * @access public
  125.      */
  126.     function getPageRangeByPageId($pageid = null)
  127.     {
  128.         $pageid = isset($pageid) ? (int)$pageid : $this->_currentPage;
  129.         if (isset($this->_pageData[$pageid]) || is_null($this->_itemData)) {
  130.             // I'm sure I'm missing something here, but this formula works
  131.             // so I'm using it until I find something simpler.
  132.             $start = ((($pageid + (($this->_delta - ($pageid % $this->_delta))) % $this->_delta) / $this->_delta) - 1) * $this->_delta +1;
  133.             return array(
  134.                 max($start, 1),
  135.                 min($start+$this->_delta-1, $this->_totalPages)
  136.             );
  137.         } else {
  138.             return array(0, 0);
  139.         }
  140.     }
  141.  
  142.     // }}}
  143.     // {{{ getLinks()
  144.  
  145.     /**
  146.      * Returns back/next/first/last and page links,
  147.      * both as ordered and associative array.
  148.      *
  149.      * NB: in original PEAR::Pager this method accepted two parameters,
  150.      * $back_html and $next_html. Now the only parameter accepted is
  151.      * an integer ($pageID), since the html text for prev/next links can
  152.      * be set in the constructor. If a second parameter is provided, then
  153.      * the method act as it previously did. This hack's only purpose is to
  154.      * mantain backward compatibility.
  155.      *
  156.      * @param integer $pageID Optional pageID. If specified, links
  157.      *                for that page are provided instead of current one.
  158.      *                [ADDED IN NEW PAGER VERSION]
  159.      * @param  string $next_html HTML to put inside the next link
  160.      *                [deprecated: use the constructor instead]
  161.      * @return array Back/pages/next links
  162.      */
  163.     function getLinks($pageID=null, $next_html='')
  164.     {
  165.         //BC hack
  166.         if (!empty($next_html)) {
  167.             $back_html = $pageID;
  168.             $pageID = null;
  169.         }
  170.  
  171.         if ($pageID != null) {
  172.             $_sav = $this->_currentPage;
  173.             $this->_currentPage = $pageID;
  174.  
  175.             $this->links = '';
  176.             if ($this->_totalPages > $this->_delta) {
  177.                 $this->links .= $this->_printFirstPage();
  178.             }
  179.             $this->links .= $this->_getBackLink('', $back_html);
  180.             $this->links .= $this->_getPageLinks();
  181.             $this->links .= $this->_getNextLink('', $next_html);
  182.             if ($this->_totalPages > $this->_delta) {
  183.                 $this->links .= $this->_printLastPage();
  184.             }
  185.         }
  186.  
  187.         $back  = str_replace(' ', '', $this->_getBackLink());
  188.         $next  = str_replace(' ', '', $this->_getNextLink());
  189.         $pages = $this->_getPageLinks();
  190.         $first = $this->_printFirstPage();
  191.         $last  = $this->_printLastPage();
  192.         $all   = $this->links;
  193.         $linkTags = $this->linkTags;
  194.  
  195.         if ($pageID != null) {
  196.             $this->_currentPage = $_sav;
  197.         }
  198.  
  199.         return array(
  200.                     $back,
  201.                     $pages,
  202.                     trim($next),
  203.                     $first,
  204.                     $last,
  205.                     $all,
  206.                     $linkTags,
  207.                     'back'  => $back,
  208.                     'pages' => $pages,
  209.                     'next'  => $next,
  210.                     'first' => $first,
  211.                     'last'  => $last,
  212.                     'all'   => $all,
  213.                     'linktags' => $linkTags
  214.                 );
  215.     }
  216.  
  217.     // }}}
  218.     // {{{ _getPageLinks()
  219.  
  220.     /**
  221.      * Returns pages link
  222.      *
  223.      * @param $url  URL to use in the link
  224.      *              [deprecated: use the constructor instead]
  225.      * @return string Links
  226.      * @access private
  227.      */
  228.     function _getPageLinks($url='')
  229.     {
  230.         //legacy setting... the preferred way to set an option now
  231.         //is adding it to the constuctor
  232.         if (!empty($url)) {
  233.             $this->_path = $url;
  234.         }
  235.  
  236.         $links = '';
  237.  
  238.         $limits = $this->getPageRangeByPageId($this->_currentPage);
  239.  
  240.         for ($i=$limits[0]; $i<=min($limits[1], $this->_totalPages); $i++) {
  241.             if ($i != $this->_currentPage) {
  242.                 $this->range[$i] = false;
  243.                 $links .= sprintf('<a href="%s" %s title="%s">%d</a>',
  244.                                 ( $this->_append ? $this->_url.$i : $this->_url.sprintf($this->_fileName, $i) ),
  245.                                 $this->_classString,
  246.                                 $this->_altPage.' '.$i,
  247.                                 $i);
  248.             } else {
  249.                 $this->range[$i] = true;
  250.                 $links .= $this->_curPageSpanPre . $i . $this->_curPageSpanPost;
  251.             }
  252.             $links .= $this->_spacesBefore
  253.                    . (($i != $this->_totalPages) ? $this->_separator.$this->_spacesAfter : '');
  254.         }
  255.  
  256.         if ($this->_clearIfVoid) {
  257.             //If there's only one page, don't display links
  258.             if ($this->_totalPages < 2) $links = '';
  259.         }
  260.  
  261.         return $links;
  262.     }
  263.  
  264.     // }}}
  265.     // }}}
  266. }
  267. ?>